﻿using Microsoft.SharePoint;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;

namespace SPAutomaticListsPopulator
{
    public static class RandomHelper
    {
        private static Random randomSeed = new Random();

        /// <summary>
        /// Generates a random string with the given length
        /// </summary>
        /// <param name="size">Size of the string</param>
        /// <param name="lowerCase">If true, generate lowercase string</param>
        /// <returns>Random string</returns>
        public static string RandomString(int size, bool lowerCase)
        {
            // StringBuilder is faster than using strings (+=)
            StringBuilder RandStr = new StringBuilder(size);

            // Ascii start position (65 = A / 97 = a)
            int Start = (lowerCase) ? 97 : 65;

            // Add random chars
            for (int i = 0; i < size; i++)
                RandStr.Append((char)(26 * randomSeed.NextDouble() + Start));

            return RandStr.ToString();
        }

        /// <summary>
        /// Returns a random number.
        /// </summary>
        /// <param name="min">Minimal result</param>
        /// <param name="max">Maximal result</param>
        /// <returns>Random number</returns>
        public static int RandomNumber(int Minimal, int Maximal)
        {
            return randomSeed.Next(Minimal, Maximal);
        }

        /// <summary>
        /// Returns a random boolean value
        /// </summary>
        /// <returns>Random boolean value</returns>
        public static bool RandomBool()
        {
            return (randomSeed.NextDouble() > 0.5);
        }

        /// <summary>
        /// Returns a random color
        /// </summary>
        /// <returns></returns>
        public static System.Drawing.Color RandomColor()
        {
            return System.Drawing.Color.FromArgb(
                randomSeed.Next(256),
                randomSeed.Next(256),
                randomSeed.Next(256)
            );
        }

        public static DateTime RandomDate(Random rand, DateTime startDate, DateTime endDate)
        {
            TimeSpan timeSpan = endDate - startDate;
            TimeSpan newSpan = new TimeSpan(0, rand.Next(0, (int)timeSpan.TotalMinutes), 0);
            DateTime newDate = startDate + newSpan;
            return newDate;
        }

        public static object RandomArrayItem(IList choices)
        {
            Random rnd = new Random();
            int r = rnd.Next(choices.Count);
            return choices[r];
        }

        public static SPFieldMultiChoiceValue RandomMultiChoiceValue(IList _choices, int minNumberOfValues, int maxNumberOfValues)
        {
            System.Array array = System.Array.CreateInstance(typeof(string), _choices.Count);
            _choices.CopyTo(array, 0);
            IList<string> choices = array.Cast<string>().ToList();

            Random rndNumber = new Random();
            int randomNumberOfValues = rndNumber.Next(minNumberOfValues,maxNumberOfValues);

            SPFieldMultiChoiceValue value = new SPFieldMultiChoiceValue();
            for (int i = 0; i < randomNumberOfValues; i++)
            {
                Random rnd = new Random();
                int randomValueNumber = rnd.Next(1, choices.Count);
                string currentValue = choices[randomValueNumber-1].ToString();
                value.Add(currentValue);
                choices.Remove(currentValue);
                maxNumberOfValues -= 1;
                if ((maxNumberOfValues == 0) ||(choices.Count == 0))
                {
                    break;
                }
            }
            return value;
        }

        public static SPFieldUrlValue RandomSPFieldUrlValue()
        {
            SPFieldUrlValue url = new SPFieldUrlValue();
            string sitename = RandomString(10, true);
            url.Url = string.Format("http://www.{0}.com", sitename);
            url.Description = sitename;
            return url; 
        }
    }
}
